package thread.synchronized_;

/**
 * Created with IntelliJ IDEA
 * Description:Synchronized学习
 * User:22954
 * Date:2024-03-06
 * Time:20:17
 */
public class Synchronized {
    /*
    Synchronized上锁方法:
        1. public static synchronized void func() {...}  修饰静态方法
        2. public synchronized void func() {...}  修饰非静态方法
        3. public void func() {
               synchronized(...) {...}
           }  修饰代码块
     =================================================================
     Synchronized上锁的元素:
        修饰方法:
            静态方法,锁定的是当前类
            非静态方法,锁定的是方法的调用者
        修饰代码块:
            锁定()内传入的元素(可以是类也可以是对象)
     ------------------------------------------------------------------
     自己见解:
        非synchronized修饰的方法/代码块走公共路线,即调即用
        被synchronized修饰的方法/代码块走排队路线,被调用时根据锁定元素(指示物)排队执行
            锁定同一个锁定元素的所有方法/代码块(可以是同一个方法/代码块),无论在哪个线程,同一时间只能执行一个方法(即上锁)
            对xx上锁----根据指示物占用唯一可执行的通道
        synchronized既锁定元素也锁定方法/代码块
     ===============================================================================
     释放锁:
        1.当前线程的同步方法/同步代码块执行结束
        2.当前线程的同步方法/同步代码块遇到break/return
        3.当前线程的同步方法/同步代码块中出现了Error/Exception,导致异常结束
        4.当前线程在同步方法/同步代码块中执行了线程对象的wait()方法,当前线程暂停,并释放锁
     不释放锁:
        1.线程执行同步方法/同步代码块时,调用Thread.sleep()方法/Thread.yield()方法暂停当前线程的执行,不会释放锁
        2.线程执行同步方法/同步代码块时,其他线程调用该线程的suspend()方法将该线程挂起,该线程不会释放锁
          *应尽量避免使用suspend()和resume()来控制线程,已过时,不在推荐使用
     */
}

